// 玻璃效果Shader
// 保存路径: Assets/Shaders/GlassShader.shader
Shader "Custom/GlassEffect" {
    // 属性面板，在Inspector中可调整的参数
    Properties {
        // 基础颜色，影响玻璃的色调
        _Color ("玻璃颜色", Color) = (0.9, 0.95, 1.0, 0.5)
        // 折射强度，控制光线弯曲程度
        _RefractionStrength ("折射强度", Range(0, 0.5)) = 0.1
        // 反射强度，控制环境反射的清晰度
        _ReflectionStrength ("反射强度", Range(0, 1)) = 0.8
        // 光滑度，控制高光大小和反射清晰度
        _Smoothness ("光滑度", Range(0, 1)) = 0.9
        // 环境贴图，用于反射效果
        _CubeMap ("环境贴图", Cube) = "_Skybox" {}
    }

    // 子着色器，包含渲染通道
    SubShader {
        // 渲染队列设置为透明，确保正确的渲染顺序
        Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
        LOD 100

        // 抓取屏幕图像用于折射效果
        GrabPass { "_GrabTexture" }

        // 渲染通道
        Pass {
            // 开启Alpha混合
            Blend SrcAlpha OneMinusSrcAlpha
            // 开启深度写入
            ZWrite On
            // 关闭光照剔除，确保玻璃两面都可见
            Cull Off
            // 添加光照模式标签
            Tags { "LightMode" = "ForwardBase" }

            // CG着色器程序开始
            CGPROGRAM
            // 使用Surface Shader，并指定光照模型和顶点着色器
            #pragma vertex vert
            #pragma fragment frag
            // 包含Unity内置CG函数
            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc" // 添加光照常用变量定义

            // 声明属性变量
            float4 _Color;
            float _RefractionStrength;
            float _ReflectionStrength;
            float _Smoothness;
            samplerCUBE _CubeMap;
            // 抓取的屏幕纹理
            sampler2D _GrabTexture;
            // 抓取纹理的纹理矩阵
            float4 _GrabTexture_ST;

            // 顶点输入结构体
            struct appdata {
                float4 vertex : POSITION;   // 顶点位置
                float3 normal : NORMAL;     // 顶点法线
            };

            // 顶点输出结构体（传递给片段着色器）
            struct v2f {
                float4 pos : SV_POSITION;   // 裁剪空间位置
                float3 normal : TEXCOORD0;  // 法线
                float3 viewDir : TEXCOORD1; // 视角方向
                float4 grabPos : TEXCOORD2; // 抓取纹理坐标
            };

            // 顶点着色器
            v2f vert (appdata v) {
                v2f o;
                // 将顶点位置转换到裁剪空间
                o.pos = UnityObjectToClipPos(v.vertex);
                // 将法线从对象空间转换到世界空间
                o.normal = UnityObjectToWorldNormal(v.normal);
                // 计算视角方向（世界空间）
                o.viewDir = normalize(UnityWorldSpaceViewDir(mul(unity_ObjectToWorld, v.vertex)));
                // 计算抓取纹理坐标
                o.grabPos = ComputeGrabScreenPos(o.pos);
                return o;
            }

            // 片段着色器
            fixed4 frag (v2f i) : SV_Target {
                // 归一化法线
                float3 normal = normalize(i.normal);
                // 归一化视角方向
                float3 viewDir = normalize(i.viewDir);

                // 计算反射方向
                float3 reflectDir = reflect(-viewDir, normal);
                // 采样环境贴图获取反射颜色
                fixed4 reflection = texCUBE(_CubeMap, reflectDir);
                // 应用反射强度
                reflection.rgb *= _ReflectionStrength;

                // 计算折射方向
                float3 refractDir = refract(-viewDir, normal, 1.0 / 1.5); // 1.5是玻璃的折射率
                // 偏移抓取纹理坐标以模拟折射
                i.grabPos.xy += refractDir.xy * _RefractionStrength;
                // 采样抓取纹理获取折射颜色
                fixed4 refraction = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.grabPos));

                // 计算高光
                float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                float3 halfDir = normalize(viewDir + lightDir);
                float spec = pow(max(dot(normal, halfDir), 0.0), 16.0 * _Smoothness);
                fixed4 specular = _LightColor0 * spec;

                // 混合颜色：折射颜色 + 反射颜色 + 高光 + 基础颜色
                fixed4 col = refraction + reflection + specular + _Color;
                // 设置透明度
                col.a = _Color.a;

                return col;
            }
            ENDCG
        }
    }
    // 后备Shader，当硬件不支持上述Shader时使用
    FallBack "Diffuse"
}